% bool values
/true     0 0 eq def
/false    0 0 ne def

% type values
/t_none          0 def
/t_int           1 def
/t_unsigned      2 def
/t_bool          3 def
/t_string        4 def
/t_code          5 def
/t_ret           6 def
/t_prim          7 def
/t_sec           8 def
/t_dict_idx      9 def
/t_array        10 def
/t_end          11 def
/t_ptr          12 def

/.value { t_int settype } def
/.undef 0 t_none settype def
/.end 0 t_end settype def


% Convert object to pointer.
%
% ( obj ) ==> ( ptr )
%
/cvp { t_ptr settype } def

/cvs { t_string settype } def


% ( size ) ==> ( string )
/string {
  1 add malloc cvs
} def


% ( obj_1 ... obj_n string_1 string_2 ) ==> ( )
%
/sprintf {
  dup cvp length exch snprintf
} def
  

% ( number ) ==> ( )
%
/number.print {
  32 string
  exch over
  "%d" exch sprintf
  dup show
  free
} def

% Allocate and define a new color.
%
% ( palette ) ==> ( color )
%
/newcolor {
  colorbits 8 le {
    newcolor.count .undef eq { /newcolor.count 0 def } if
    newcolor.count
    dup rot setpalette
    /newcolor.count newcolor.count 1 add def
  } if
  def
} def

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
% ( color0 color1 width height ) ==> ( )
/drawborder {
  currentpoint /db.y0 exch def /db.x0 exch def

  /db.y1 exch 1 sub db.y0 add def
  /db.x1 exch 1 sub db.x0 add def
  /db.col1 exch def
  /db.col0 exch def

  db.x0 db.y1 moveto

  db.col0 setcolor
  db.x0 db.y0 lineto db.x1 db.y0 lineto

  db.col1 setcolor
  db.x1 db.y1 lineto db.x0 db.y1 lineto
} def


640 480 8 findmode setmode not { false .end } if

"16x16.fnt" findfile setfont

% "sky.jpg" findfile setimage
% 0 0 moveto 0 0 image.size image

/black 0x000000 newcolor
/white 0xffffff newcolor
/gray  0x808080 newcolor
/blue  0x0000c0 newcolor
/green 0x00c000 newcolor
/red   0xf00000 newcolor
/yellow 0xe0e000 newcolor

/x 300 def
/y 100 def
/w 90 def
/h 50 def

/msg 200 string def

{
  blue setcolor
  0 0 moveto screen.size fillrect

  h w y x "x %d, y %d, w %d, h %d" msg sprintf

  0 0 moveto white setcolor msg show

  x 1 sub y 1 sub moveto white white w 2 add h 2 add drawborder
  green setcolor
  x y moveto w h fillrect
  x 1 add y 1 add moveto yellow yellow w 2 sub h 2 sub drawborder


  x y moveto w h savescreen /s0 exch def


  x 1 sub y 1 sub 200 add moveto red red w 2 add h 2 add drawborder
  x y 200 add moveto s0 restorescreen

  trace

  /w w 1 sub def

} loop
